#include "utils.h"
#include "disk_builder.h"
#include "ext4_scanner.h"
#include "oci_builder.h"
#include <unistd.h>
#include <stdlib.h>

void print_usage(const char* prog) {
    fprintf(stderr, "用法: %s -i <rootfs_目录> -o <输出目录> -s <磁盘大小_MB>\n", prog);
    fprintf(stderr, "  -i: 容器根文件系统所在的目录路径 (必需)\n");
    fprintf(stderr, "  -o: 生成的镜像产物存放的目录 (必需)\n");
    fprintf(stderr, "  -s: 用于创建文件系统的虚拟磁盘大小, 单位MB (必需)\n");
}

int main(int argc, char *argv[]) {
    char *rootfs_path = NULL;
    char *output_dir = NULL;
    long disk_size_mb = 0;
    int opt;

    while ((opt = getopt(argc, argv, "i:o:s:")) != -1) {
        switch (opt) {
        case 'i': rootfs_path = optarg; break;
        case 'o': output_dir = optarg; break;
        case 's': disk_size_mb = atol(optarg); break;
        default:
            print_usage(argv[0]);
            return 1;
        }
    }

    if (!rootfs_path || !output_dir || disk_size_mb <= 0) {
        print_usage(argv[0]);
        return 1;
    }

    if (run_command("mkdir -p %s", output_dir) != 0) return 1;

    char disk_path[1024];
    snprintf(disk_path, sizeof(disk_path), "%s/filesystem.img", output_dir);

    if (create_and_populate_disk(disk_path, disk_size_mb, rootfs_path) != 0) {
        LOG_ERROR("构建虚拟磁盘失败");
        return 1;
    }

    // // ***** 关键调试点：暂停程序 *****
    // printf("\n\n===== 程序已暂停 =====\n");
    // printf("filesystem.img 已在 %s 中生成。\n", output_dir);
    // printf("请打开一个新的终端, 执行诊断命令, 然后回到这里按 Enter 键继续...\n");
    // getchar(); // 等待用户输入

    if (scan_ext4_and_build_map(disk_path, output_dir) != 0) {
        LOG_ERROR("扫描文件系统并构建 LBA map 失败");
        return 1;
    }
    
    if (build_oci_layout(output_dir) != 0) {
        LOG_ERROR("构建 OCI 布局失败");
        return 1;
    }

    LOG_INFO("镜像构建成功! 产物位于: %s", output_dir);
    LOG_INFO("您现在可以使用 'oras' 或 'skopeo' 等工具将该目录推送到镜像仓库。");

    return 0;
}